/* dll.h - declaracao da interface entre a aplicacao e a camada de enlace
 */
#ifndef _DLL_H_  /* Prevenção contra múltipasl inclusões */
#define _DLL_H_

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <assert.h>
#include <string.h>

#include "our/package.h"

/* As seguintes funcoes fazem parte da interface, como descrito no
 * enunciado do TP1:
 *
 * int dll_init( void );
 *     Inicializa a camada de enlace (data link layer).
 *     Pode ser usada para a inicialização de estruturas de dados internas
 *     à camada e deve obrigatoriamente chamar a função de inicialização
 *     da interface de baixo nível.
 *
 * int dll_stats( void );
 *     Usada para exibir na tela estatísticas de uso da camada de enlace
 *     conforme seja desejado. Deve obrigatoriamente chamar a função
 *     equivalente para a camada de baixo nível. Após a exibição das
 *     estatísticas, todos os contadores devem ser reinicializados para
 *     uma nova rodada de medições.
 *
 * int dll_mtu( void );
 *     Retorna o tamanho máximo das mensagens aceitas pelo protocolo de
 *     enlace (Maximum Transfer Unit).
 *
 * int dll\_send( void* mensagem, int tamanho );
 *     Entrega o buffer indicado por mensagem (com o número de bytes dado
 *     por tamanho) para ser enviado pela camada de enlace. O retorno
 *     dessa função indica que os bytes foram recebidos pela camada de
 *     enlace para serem enviados, podendo o buffer ser reutilizado para
 *     novas mensagens. Não há nenhuma relação entretanto com o envio pela
 *     rede ou a chegada da mensagem ao destino.
 *
 * int dll_recv( void* mensagem, int tammax );
 *     Um programa chama essa função para solicitar uma mensagem à camada
 *     de enlace. A função bloqueia até que tal mensagem esteja disponível,
 *     retornando quando os bytes da mensagem tiverem sido copiados para
 *     o buffer mensagem. O parâmetro tammax tem a mesma semântica da
 *     interface de sockets: indica o número máximo de bytes da mensagem
 *     recebida que devem ser copiados para o buffer. Se a mensagem for
 *     menor, apenas os bytes nela contidos serão copiados; se ela for
 *     maior, os bytes excedentes serão descartados. A função retorna o
 *     número de bytes realmente copiados.
 *
 * void dll_shutdown( void );
 *     Finaliza a utilização da camada de enlace. Mensagens que tenham sido
 *     recebidas mas não tenham sido lidas com dll\_recv serão descartadas. 
 * 
 * Para todas as funções, um valor de retorno negativo indica um erro e a
 * variável global errno oferece uma descrição do erro, que pode ser
 * transformado em uma mensagem na tela pela função perror (da stdio).
 * 
 */

#define FINISH -5

int  dll_init( void );
void dll_stats( void );
int  dll_mtu( void );
int  dll_send( void* mensagem, int tamanho );
int  dll_recv( void* mensagem, int tammax );
void dll_shutdown( void );


int init_pipe_fork();
void watch_fds();

#endif /* _DLL_H_ */
